﻿using System;



namespace RectangleApplication

{

    // (1) 矩形类Rect

    class Rect

    {

        // 属性

        public double Width { get; set; }

        public double Height { get; set; }



        // 带两个参数的构造方法

        public Rect(double width, double height)

        {

            Width = width;

            Height = height;

        }



        // 不带参数的构造方法

        public Rect() : this(10, 10) // 调用带参构造方法，设置默认值

        {

        }



        // 求矩形面积的方法

        public double Area()

        {

            return Width * Height;

        }



        // 求矩形周长的方法

        public double Perimeter()

        {

            return 2 * (Width + Height);

        }

    }



    // (2) 具有确定位置的矩形类PlainRect，继承自Rect

    class PlainRect : Rect

    {

        // 添加两个属性：矩形左上角坐标

        public double StartX { get; set; }

        public double StartY { get; set; }



        // 带4个参数的构造方法

        public PlainRect(double startX, double startY, double width, double height)

            : base(width, height) // 调用基类构造方法

        {

            StartX = startX;

            StartY = startY;

        }



        // 不带参数的构造方法

        public PlainRect() : this(0, 0, 0, 0) // 调用带参构造方法，设置默认值

        {

        }



        // 判断某个点是否在矩形内部的方法

        public bool IsInside(double x, double y)

        {

            // 计算矩形的右下角坐标

            double endX = StartX + Width;

            double endY = StartY + Height;



            // 判断点是否在矩形内部

            return (x >= StartX && x <= endX && y >= StartY && y <= endY);

        }



        // 显示矩形信息的方法（便于测试）

        public void DisplayInfo()

        {

            Console.WriteLine($"矩形信息: 左上角({StartX}, {StartY}), 宽={Width}, 高={Height}");

            Console.WriteLine($"面积: {Area()}, 周长: {Perimeter()}");

        }

    }



    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("矩形类测试程序");

            Console.WriteLine("==============");

            Console.WriteLine();



            // (3) 测试PlainRect类

            // 创建一个左上角坐标为(10, 10)，长为20，宽为10的矩形对象

            PlainRect rect = new PlainRect(10, 10, 20, 10);



            // 显示矩形信息

            rect.DisplayInfo();

            Console.WriteLine();



            // 计算并打印输出矩形的面积和周长

            Console.WriteLine($"矩形面积: {rect.Area()}");

            Console.WriteLine($"矩形周长: {rect.Perimeter()}");

            Console.WriteLine();



            // 判断点(25.5, 13)是否在矩形内，并打印输出相关信息

            double testX = 25.5;

            double testY = 13;

            bool isInside = rect.IsInside(testX, testY);



            Console.WriteLine($"点({testX}, {testY}) {(isInside ? "在" : "不在")}矩形内");

            Console.WriteLine();



            // 额外测试：测试其他点

            TestPoint(rect, 15, 15);  // 应该在内部

            TestPoint(rect, 5, 15);   // 应该在外部（x太小）

            TestPoint(rect, 35, 15);  // 应该在外部（x太大）

            TestPoint(rect, 15, 5);   // 应该在外部（y太小）

            TestPoint(rect, 15, 25);  // 应该在外部（y太大）



            Console.ReadLine();

        }



        // 辅助方法：测试点是否在矩形内

        static void TestPoint(PlainRect rect, double x, double y)

        {

            bool isInside = rect.IsInside(x, y);

            Console.WriteLine($"点({x}, {y}) {(isInside ? "在" : "不在")}矩形内");

        }

    }

}